package sip_core

import (
	"gobase/utils"
)

// CodeType 国标编码类型
type CodeType int

const (
	SipTypeA    CodeType = iota + 1 // 国标编码类型A
	SipTypeB                        // 国标编码类型B
	PrivateType                     // 私有编码类型
)

// SipCode 国标编码
type SipCode struct {
	CodeType        //编码规则 1:国标编码规则A 2:国标编码规则B 3:私有编码
	Province string //省 2位
	City     string //市 2位
	Area     string //区 2位
	Unit     string //单位 2位
	Industry string //行业编码 2位
	TypeCode string //类型编码 A3位 B2位
	NetCode  string //网络标识(仅国标A规则使用) 1位
	SNo      string //序号 6位
}

// NewSipCode 创建一个新的国标编码
func NewSipCode() *SipCode {
	return &SipCode{}
}

// ExampleSipCode 示例国标编码
func ExampleSipCode() *SipCode {
	str := "37040200442000000001"
	code := NewSipCode()
	code.ParseCode(str)
	return code
}

// String 输出为字符串
func (c *SipCode) String() string {
	switch c.CodeType {
	case 1:
		return utils.StringBuilder(c.Province, c.City, c.Area, c.Unit, c.Industry, c.TypeCode, c.NetCode, c.SNo)
	case 2:
		return utils.StringBuilder(c.Province, c.City, c.Area, c.Unit, c.Industry, c.SNo, c.TypeCode)
	case 3:
		return utils.StringBuilder(c.Province, c.City, c.Area, c.Unit, c.Industry, c.SNo)
	default:
		return ""
	}
}

// ParseCode 解析国标编码
func (c *SipCode) ParseCode(s string) *SipCode {
	switch len(s) {
	case 20:
		c.CodeType = 1
	case 18:
		c.CodeType = 2
	default:
		if len(s) < 16 {
			return c
		}
		c.CodeType = 3
	}
	c.Province = s[0:2]
	c.City = s[2:4]
	c.Area = s[4:6]
	c.Unit = s[6:8]
	c.Industry = s[8:10]
	switch c.CodeType {
	case 1:
		c.TypeCode = s[10:13]
		c.NetCode = s[13:14]
		c.SNo = s[15:]
	case 2:
		c.SNo = s[10:16]
		c.TypeCode = s[17:]
	case 3:
		c.SNo = s[10:]
	}
	return c
}

// GetProvince 获取省码
func (c SipCode) GetProvince() string {
	return utils.StringBuilder(c.Province, "0000")
}

// GetCity 获取市码
func (c SipCode) GetCity() string {
	return utils.StringBuilder(c.Province, c.City, "00")
}

// GetArea 获取区/县码
func (c *SipCode) GetArea() string {
	return utils.StringBuilder(c.Province, c.City, c.Area)
}
